home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
a_utils
/
decomp.lha
/
decomp
/
objfile.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-01-12
|
4KB
|
214 lines
/*
* Module: objfile.c
*
* Author: J. Reuter
*
* This module contains code that reads the various parts of object
* and a.out symbol tables. These "parts" include the symbol table
* proper, the "string" table that contains the symbol names, and
* the relocation table, if it exists.
*/
#include "defs.h"
#include "main.h"
#include <sys/types.h>
#include <sys/stat.h>
char *strtab;
struct nlist *symtab;
int nsym;
struct relocation_info *rel;
int nrel;
char *datatab;
int ndata;
int datoff;
sym_read()
{
struct stat statbuf;
int stab_size;
/* read the string table */
fseek( objfile, N_STROFF( obj_header ), 0 );
fstat( fileno( objfile ), &statbuf );
stab_size = statbuf.st_size - N_STROFF( obj_header );
strtab = (char *)malloc( stab_size );
if ( strtab == NULL ) {
fprintf( stderr, "Out of memory\n" );
exit( 1 );
}
fread( strtab, 1, stab_size, objfile );
/* read the symbol table proper */
fseek( objfile, N_SYMOFF( obj_header ), 0 );
nsym = obj_header.a_syms;
symtab = (struct nlist *) malloc( nsym );
if ( symtab == NULL ) {
fprintf( stderr, "Out of memory\n" );
exit( 1 );
}
fread( symtab, 1, nsym, objfile );
/* read the relocaion table */
fseek( objfile, N_TRLOFF( obj_header ), 0 );
nrel = obj_header.a_trsize + obj_header.a_drsize;
rel = (struct relocation_info *) malloc( nrel );
if ( rel == NULL ) {
fprintf( stderr, "Out of memory\n" );
exit( 1 );
}
fread( rel, 1, nrel, objfile );
/* read initialized data */
datoff = N_DATOFF( obj_header );
fseek( objfile, datoff, 0 );
ndata = N_TRLOFF( obj_header) - datoff;
datatab = malloc( ndata );
if ( datatab == NULL ) {
fprintf( stderr, "Out of memory\n" );
exit( 1 );
}
fread( datatab, 1, ndata, objfile );
datoff -= N_TXTOFF( obj_header ); /* offset by header size */
}
struct relocation_info *relo_cur;
relo_first()
{
relo_cur = rel;
}
struct relocation_info *
relo_next()
{
if ( relo_cur - rel >= nrel )
return NULL;
else
return relo_cur++;
}
sym_find( addr )
address addr;
{
int i;
for ( i=0; i < nsym/sizeof(struct nlist); i++ )
if ( (symtab+i)->n_value == addr )
return i;
return -1;
}
char *
prname( name )
char *name;
{
if ( name[0] == '_' )
return name + 1;
else
return name;
}
#ifdef debug
symdump()
{
register int i;
register struct nlist *s;
printf( "Name Type Other Desc Value\n" );
for ( i=0; i<nsym/sizeof(struct nlist); i++ ) {
s = symtab+i;
printf( "%-15s %3d %4d %6x %8d\n",
&strtab[s->n_un.n_strx], s->n_type, s->n_other,
s->n_desc, s->n_value );
}
}
reldump( start, count )
int start;
int count;
{
int i;
struct nlist *s;
start /= sizeof( struct relocation_info );
count /= sizeof( struct relocation_info );
printf( " Address Pcrel Length Extrn Stype Sval Sname\n" );
for ( i=start; i < count+start; i++ ) {
s = &symtab[(rel+i)->r_symbolnum];
printf( "%8d %5d %6d %3d %3d %6d %-30s\n",
(rel+i)->r_address,
(rel+i)->r_pcrel, (rel+i)->r_length, (rel+i)->r_extern,
s->n_type, s->n_value, &strtab[s->n_un.n_strx] );
}
}
#endif debug
/*
* The following routines allow reading of the code section of the
* object file.
*/
static long current_pos = 0;
char
get_byte( addr )
address addr;
{
char byte;
if ( addr != current_pos ) {
fseek( objfile, offset + addr, 0 );
current_pos = addr;
}
fread( &byte, sizeof(byte), 1, objfile );
current_pos += 1;
return byte;
}
short
get_word( addr )
address addr;
{
short word;
if ( addr != current_pos ) {
fseek( objfile, offset + addr, 0 );
current_pos = addr;
}
fread( &word, sizeof(word), 1, objfile );
current_pos += 2;
return word;
}
long
get_long( addr )
address addr;
{
long longword;
if ( addr != current_pos ) {
fseek( objfile, offset + addr, 0 );
current_pos = addr;
}
fread( &longword, sizeof(longword), 1, objfile );
current_pos += 4;
return longword;
}